package com.vmloft.develop.app.demo

/**
 * Created by lzan13 on 2024/03/10
 * 描述：自定义 list 类实现
 */
class CustomList {

    // 默认容量
    private val defaultCount = 10

    // 内部使用数组存储数据
    private var array: Array<Any?> = Array(defaultCount) {}

    // 当前存储数量
    private var currentCount: Int = 0

    /**
     * 添加数据到指定位置
     * @param data 添加的数据
     */
    fun add(data: Any) {
        // 检查扩容
        checkCount()
        array[currentCount] = data
        currentCount++
    }

    /**
     * 添加数据
     * @param index 添加位置下标
     * @param data 添加的数据
     */
    fun add(index: Int, data: Any) {
        // 检查扩容
        checkCount(index)
        array[currentCount] = data
        currentCount++
    }

    /**
     * 移除数据
     * @param index 数据下标
     */
    fun removeAt(index: Int) {
        if (index == currentCount - 1) {
            // 移除的是最后一位
            array[index] = null
        } else {
            val tempArray = Array<Any?>(array.size) { i ->
                if (i < index) {
                    array[i]
                } else if (i == index) {

                } else {
                    array[i - 1]
                }
            }
        }
    }

    /**
     * 移除数据
     * @param data 要移除的数据
     */
    fun remove(data: Any) {
        var i = 0
        for (value in array) {
            if (value == data) {
                remove(i)
            }
            i++
        }
    }

    /**
     * 更新指定下标位置数据
     * @param index 需要更新数据下标
     * @param data 更新后的数据
     */
    fun update(index: Int, data: Any) {
        // 直接替换
        array[index] = data
    }

    /**
     * 检查容器容量，如果不足以存储内容，就进行扩容
     * @param index 这是新加入数据位置，用来判断拷贝数据结束点
     */
    private fun checkCount(index: Int = -1) {
        if (array.size == currentCount) {
            val tempCount = array.size * 2
            val tempArray = Array<Any?>(tempCount) { i ->
                if (index >= 0) {
                    if (i < index) {
                        // 复制插入前的内容
                        array[i]
                    } else if (i == index) {
                        // 被插入位置留空
                    } else {
                        // 复制插入之后的内容
                        array[i - 1]
                    }
                } else {
                    // 一对一复制内容到新数组
                    array[i]
                }
            }
            // 赋值新数组，完成扩容
            array = tempArray
        } else {
            // 暂时不需要做
        }
    }
}